package org.jgs1904.realm;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.realm.AuthenticatingRealm;
import org.apache.shiro.util.ByteSource;

/**
 * 自定义的realm类，在该类中可以声明自定义的登录认证和授权的方法
 */
public class MyRealm extends AuthenticatingRealm {

    protected AuthenticationInfo doGetAuthenticationInfo1(AuthenticationToken token) throws AuthenticationException {
        System.out.println("执行认证");
        // 用户名
        String username = token.getPrincipal().toString();
        // 密码
        String pwd = new String((char[]) token.getCredentials());
        System.out.println(username + "  " + pwd);
        // 先从数据库查询select * from user where username=? 查看用户名是否存在
        if (username.equals("admin")) {// 假设用户名为admin时能从数据库中查询出来
            // 根据之前查询出来的用户信息获取密码。假设查询出来的密码是pwd
            String password = "pwd";
            // 此处需要注意，第二个参数是从数据库查询出来的密码，而不是传递过来的密码。
            // 第三个参数自定义。但是尽量不重复了。常直接使用用户名当做realname名字。
            AuthenticationInfo info = new SimpleAuthenticationInfo(token.getPrincipal(), password, "realmname");
            // shiro会判断从数据库查询出来的密码和客户端传递过来的密码是否一致。
            return info;
        }
        // 返回null说明用户名不存在。
        return null;
    }


    /**
     * 增加  Realm 凭证匹配器
     *
     * @param token the authentication token containing the user's principal and credentials.
     * @return
     * @throws AuthenticationException
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        System.out.println("执行认证");
        // 用户名
        String username = token.getPrincipal().toString();
        // 密码
        String pwd = new String((char[]) token.getCredentials());
        System.out.println(username + "  " + pwd);
        // 先从数据库查询select * from user where username=? 查看用户名是否存在
        if (username.equals("admin")) {// 假设用户名为admin时能从数据库中查询出来
            // 根据之前查询出来的用户信息获取密码。假设查询出来的密码是pwd
            // 此处需要注意，第二个参数是从数据库查询出来的密码，而不是传递过来的密码。
            // 密码必须是MD5加密后的密码
            String password = "7614fd642608ca0755b78d2b2c352e19";
            // 假设id是从数据库中取出的id
            Long id = 123L;
            // 第三个参数是加密的盐
            AuthenticationInfo info = new SimpleAuthenticationInfo(token.getPrincipal(), password, ByteSource.Util.bytes(id + ""), token.getPrincipal().toString());
            // shiro会判断从数据库查询出来的密码和客户端传递过来的密码是否一致。
            return info;
        }
        // 返回null说明用户名不存在。
        return null;
    }

}
